iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
自我挑戰組

串接綠界服務的疑難雜症詳解系列 第 24

【綠界發票】電子發票串接-AES加解密

  • 分享至 

  • xImage
  •  

今天來教大家如何進行AES加解密

先來看一下綠界文件對AES的相關描述

AES 加密的強度設定方式是 128 bit
CipherMode : CBC
PaddingMode :PKCS7

各位在進行AES加解密的時候必須依照上述規定進行
那我們開始吧!


AES加密:

今天就拿綠界文件上的範例來看吧

首先綠界文件提供的data範例

{"Name":"Test","ID":"A123456789"}

我們要先對data進行URLEncode
文件提供了英文大寫與小寫的範例
雖然最後結果不一樣
但只要綠界系統解的開就可以
所以其實只要選一種方式來進行就可以囉
這裡就拿英文大寫來當範例

  1. 把URLEncode後的資料轉成英文大寫
%7B%22Name%22%3A%22Test%22%2C%22ID%22%3A%22A123456789%22%7D
  1. 進行AES加密
uvI4yrErM37XNQkXGAgRgJAgHn2t72jahaMZzYhWL1HmvH4WV18VJDP2i9pTbC+tby5nxVExLLFyAkbjbS2Dvg==

實際程式該怎麼寫呢
這裡提供PHP版的AES加密程式碼:

<?php
function aesEncrypt($data, $key, $iv) {
    // 對 data 進行 URLEncode
    $encodedData = urlencode($data);

    // 使用 AES-128-CBC 模式進行加密,並設定填充方式為 PKCS7
    $encryptedData = openssl_encrypt(
        $encodedData,
        'AES-128-CBC',
        $key,
        OPENSSL_RAW_DATA,  // 需要使用原始的二進制資料
        $iv
    );

    // 最後將加密結果進行 base64 編碼
    return base64_encode($encryptedData);
}

// Data to be encrypted
$data = '{"Name":"Test","ID":"A123456789"}';

// 綠界提供的 HashKey 和 HashIV
$key = 'ejCk326UnaZWKisg'; // HashKey (必須是 16 字節)
$iv = 'q9jcZX8Ib9LM8wYk';  // HashIV (必須是 16 字節)

// 加密資料
$encryptedResult = aesEncrypt($data, $key, $iv);

echo "加密結果: " . $encryptedResult;
?>

實際運行後
就可以得到一模一樣的加密結果囉

加密結果: uvI4yrErM37XNQkXGAgRgJAgHn2t72jahaMZzYhWL1HmvH4WV18VJDP2i9pTbC+tby5nxVExLLFyAkbjbS2Dvg==

接下來就帶大家來看怎麼解密吧


AES解密:

要如何將先前加密的結果轉換為原始的data呢?

{"Name":"Test","ID":"A123456789"}

第一步就是先按照綠界文件的AES規範進行解密
可以得到

%7B%22Name%22%3A%22Test%22%2C%22ID%22%3A%22A123456789%22%7D

最後再將解密後的data進行URLDecode就可以囉

{"Name":"Test","ID":"A123456789"}

那實際程式碼該怎麼寫呢
這裡一樣提供PHP版的AES解密程式碼:

<?php
function aesDecrypt($encryptedData, $key, $iv) {
    // 先將 Base64 字串轉換回二進位數據
    $binaryData = base64_decode($encryptedData);

    // 使用 OpenSSL 進行 AES CBC 128 解密,並且使用 PKCS7 填充
    $decryptedData = openssl_decrypt($binaryData, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

    // 對解密後的數據進行 URL 解碼
    return urldecode($decryptedData);
}

// 加密過程的參數
$hashKey = 'ejCk326UnaZWKisg';
$hashIV = 'q9jcZX8Ib9LM8wYk';
$encryptedData = 'uvI4yrErM37XNQkXGAgRgJAgHn2t72jahaMZzYhWL1HmvH4WV18VJDP2i9pTbC+tby5nxVExLLFyAkbjbS2Dvg==';  // 這是你的加密數據

// 執行解密
$decrypted = aesDecrypt($encryptedData, $hashKey, $hashIV);

echo "解密結果: " . $decrypted;

實際執行的結果

解密結果: {"Name":"Test","ID":"A123456789"}

以上就是綠界電子發票的加解密流程
有興趣的人可以自己寫看看
或是直接使用上面的程式碼跑看看哦

有問題都可以下方留言

我們明天見


上一篇
【綠界發票】電子發票串接-開立發票
下一篇
【綠界發票】電子發票串接-發票載具
系列文
串接綠界服務的疑難雜症詳解30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言